% Octave script: mm1.m
% Proposito:     Simula una cola M/M/1
%
% Declaracion de constantes y variables:
function [tiempos_clientes, queue_vec, areas] = mm1(prob_st)
%clear all

if( nargin != 1 )
	prob_st = 0.6;
end

global Q_LIMIT = 100;
global BUSY    = 1;
global IDLE    = 0;

global next_event_type;
global num_custs_delayed;
global num_delays_required;
global num_events;
global num_in_q;
global server_status;

global INFINITY = 1.0e+030;

global arrivals_mean;
global num_in_system;
global client_times;
global arrival_times;

%Variables de la UI
global ui_queue_len;
global ui_status;
global ui_mean;
%% Variables de tiempos de servicio

%Variables de las ERs
global er_queue_len;
global er_status;
global er_next_event;
global er_next_free;
global er_mean;
global num_er_busy;
%% Variables de tiempos de servicio

%Variables de la ST
global st_queue_len;
global st_status;
global st_mean;
%% Variables de tiempos de servicio

global time;
global num_arrivals;
global time_arrival;
global time_last_event;
global time_next_event;
global total_of_delays;

%Estadisticas
global area_ui_queue;
global area_er_queue;
global area_st_queue;

global area_ui_status;
global area_er1_status;
global area_er2_status;
global area_er3_status;
global area_st_status;

global queue_lengths_vec;

% Abre los archivos I/O
%inpfile = fopen('mm1.inp','r');
outfile = fopen('mm1.out','w');
timfile = fopen('mm1.tim','w');


%	Eventos:
%		1- Llega un evento a la cola de la UI.
%		2- Sale un colectivo de la UI (cae en la cola de entrada a las ERs).
%		3- Sale un colectivo de la UI y no tiene que ser analizado.
%		4- Sale un colectivo de las ERs y cae en la cola de la ST.
%		5- Sale un colectivo de la ST (sale del circuito)
%		6- Sale un colectivo de la ST (es realimentado)

%Variables de estado: Longitud de las colas, estado de los servidores.


% Especifica el numero de eventos
num_events = 6;

% Lee el archivo de entrada
%xdata = fscanf(inpfile,'%f %f %f',[1 3]);
%mean_interarrival   = xdata(1);
%mean_service        = xdata(2);
%num_delays_required = xdata(3);
num_delays_required = 1230;%385;
 

% Escribe los encabezados de los reportes y parametros de entrada
%fprintf(outfile,'Sistema de cola de servidor simple\n\n');
%fprintf(outfile,'Tiempo medio entre arribos %11.3f minutos\n\n',mean_interarrival);
%fprintf(outfile,'Tiempo medio de servicio   %11.3f minutos\n\n',mean_service);
%fprintf(outfile,'Numero de clientes         %14d\n\n', num_delays_required);

%fprintf(timfile,'Series de tiempo producidas por mm1.m \n');
%fprintf(timfile,'3\n');
%fprintf(timfile,'time\n');
%fprintf(timfile,'longitud de la cola\n');
%fprintf(timfile,'ocupacion del servidor (OCUPADO=1,LIBRE=0)\n');


% Inicializa la simulacion
initialize(prob_st);

% Corre la simulacion
while ( num_arrivals < num_delays_required )%|| num_in_system > 0 )
	%fprintf(timfile, "%16.3f %d %d\n",time,num_in_q,server_status);
	% Determina el proximo evento
	timing();
	
	% Actualiza los acumuladores estadisticos de tiempos medios
	update_time_avg_stats();
	
	% Invoca al evento apropiado

	%printf("Event %d at %g\n",next_event_type,time);
	%flush();

	switch (next_event_type)
		case 1
			arriveUI();
			%break;
		case 2
			enqueueUI();
			%break;
		case 3
			departSystemUI();
		case 4
			enqueueER();
		case 5
			departSystemST();
		case 6
			enqueueST();
	endswitch
endwhile

tiempos_clientes = client_times;
queue_vec = queue_lengths_vec;



area_ui_queue = area_ui_queue/time;
area_er_queue = area_er_queue/time;
area_st_queue = area_st_queue/time;

area_ui_status = area_ui_status/time;
area_er1_status = area_er1_status/time;
area_er2_status = area_er2_status/time;
area_er3_status = area_er3_status/time;
area_st_status = area_st_status/time;

areas = [area_ui_queue;area_er_queue;area_st_queue;area_ui_status;area_er1_status;area_er2_status;area_er3_status;area_st_status];


% Invoca al generador de reportes y fin de la simulacion
report(outfile);
%fclose(inpfile);
fclose(outfile);
fclose(timfile);

endfunction
	
